package com.qf.business.message.entity;

import lombok.Data;
import lombok.experimental.Accessors;
import org.kurento.client.MediaPipeline;

import java.io.Serializable;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * 直播房间的管理对象
 * author Ken
 * create_time 2023/1/6
 */
@Data
@Accessors(chain = true)
public class Rooms implements Serializable {
    //房间号 - 课程号
    private Long cid;
    //直播的课程名称
    private String cname;
    //主播的用户信息
    private User master;
    //直播间的 唯一的媒体管道对象  直播间的每个用户都必须基于同一个管道对象 创建出自己的WebRTCEndPoint对象
    private MediaPipeline mediaPipeline;
    //观看者的用户信息
    private Map<Long, User> slaves = new ConcurrentHashMap<>();

    public void addUser(User user){
        if (user.getRole().equals("master")) {
            //主播
            this.master = user;
        } else {
            //【重要】将观看者的端点和主播的端点关联起来
            this.getMaster().getWebRtcEndpoint().connect(user.getWebRtcEndpoint());

            //观看者
            this.slaves.put(user.getUid(), user);
        }
    }

    /**
     * 根据观看者id 获取观看者对象
     * @param uid
     */
    public User getSlave(Long uid) {
        return this.slaves.get(uid);
    }

    /**
     * 根据观看者id 删除观看者信息
     * @param uid
     */
    public User removeSlave(Long uid){
        User slave = this.slaves.remove(uid);
        return slave;
    }

    /**
     * 将消息发送给房间内的所有用户
     * @param message
     * @param isMaster 是否发送给主播
     */
    public void sendMsgAll(Message message, boolean isMaster){
        if (isMaster) {
            getMaster().getChannel().writeAndFlush(message);
        }

        for (User slave : getSlaves().values()) {
            slave.getChannel().writeAndFlush(message);
        }
    }
}
